AWS SDK for JavaからCloudFormationを使ってみる#2 テンプレートの分割
テンプレートファイルの分割
前回に引き続きCloudFormationのお話です。 AWS関連サービスをまるっと設定できるとても便利なサービスですが、システムが巨大になるにつれて、 テンプレートファイルは肥大しがちです。 また、システムまるごとを1つのスタックとして定義して、毎回作成/削除を繰り返していては、コストが大きいです。 そんなときは、今回紹介するように、CloudFormationテンプレートの分割を検討してみてください。
では、前回使用したテンプレートをベースにテンプレートの分割をためしてみましょう。
環境構築
今回使用した動作環境は以下のとおりです。
- OS : MacOS X 10.7.5
- AWS SDK for Java: v1.5.3
AWSアカウントは使える状態にしておいてください。
CloudFormationテンプレートを分割して実行してみる
今回はSQSを作成し、その結果をEC2のuserdataに対して渡してみます。 まずは、大元のテンプレートとなるparent.templateを作成しましょう。 このテンプレートでは、SQSを作成し、作成したキューの値を分割したテンプレートに渡します。
{ "AWSTemplateFormatVersion": "2010-09-09", "Parameters" : { }, "Resources": { "MyQueue" : { "Type" : "AWS::SQS::Queue" }, "ChildStack" : { "Type" : "AWS::CloudFormation::Stack", "Properties" : { "TemplateURL" : "your child template path", "Parameters" : { "MyQueue" : { "Ref" : "MyQueue" } } } } }, "Outputs" : { "SQS" : { "Value" : { "Ref" : "MyQueue" } } } }
AWS::CloudFormation::Stackタイプのリソースが、別のスタックを作成するためのリソースです。 TemplateURLは、この後作成するchild.templateのS3パスを指定してください。 また、Parametersを使用すればChildStackへのパラメータを渡すことができます。
ChildStackリソースで呼び出されるchild.templateは下記の通りです。 渡されたパラメータをUserDataとして渡して、EC2インスタンスを作成します。
{ "AWSTemplateFormatVersion": "2010-09-09", "Parameters" : { "MyQueue" : { "Type" : "String", "Description" : "queue info.", "Default" : "" } }, "Resources": { "MyEC2": { "Type": "AWS::EC2::Instance", "Properties": { "InstanceType": "m1.small", "KeyName": "<キーファイル名>", "ImageId": "<AMI ID>", "UserData": { "Fn::Base64" : { "Fn::Join" : [ "", [ "sqs=", { "Ref" : "MyQueue" },"\n", "" ] ] } } } } }, "Outputs" : { "MyEC2" : { "Value" : { "Ref" : "MyEC2" } } } }
child.templateをS3にアップし、そのパスをparent.templateのTemplateURLに指定します。 parent.templateもS3にアップし、前回と同じく下記のようなJavaプログラムを記述して実行してみましょう。
・ ・ AWSCredentials credentials = new BasicAWSCredentials("アクセスキー","シークレットキー"); AmazonCloudFormationAsyncClient cli = new AmazonCloudFormationAsyncClient(credentials); cli.setEndpoint("cloudformation.<リージョン>.amazonaws.com"); CreateStackRequest req = new CreateStackRequest(); req.setStackName("split-stack"); req.setTemplateURL("S3に保存しているparent.templateのパス"); cli.createStackAsync・・・ ・ ・
AWSコンソールでCloudFormation画面を確認してみてください。スタックが2つ作成されているはずです。 元のスタックを削除すればchild.templateで作成されたスタックも削除されます。 child.templateで作成されたスタックを削除すると、元のスタックは残ります。